package com.crawler.system.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 爬虫结果实体类
 * 存储爬虫任务抓取到的网页内容、元数据和处理状态
 * 
 * @author crawler-system
 */
@Data
@TableName(value = "crawler_result", autoResultMap = true)
public class CrawlerResult {

    /**
     * 主键ID，自增长
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 爬虫任务ID
     * 关联到crawler_task表的id字段
     */
    private Long taskId;

    /**
     * 源URL
     * 爬取的原始页面URL，最大长度1048字符
     */
    private String sourceUrl;

    /**
     * 标题
     * 网页的标题内容
     */
    private String title;

    /**
     * HTTP状态码
     * 如：200, 404, 500等
     */
    private Integer statusCode;

    /**
     * 内容类型
     * 如：text/html, application/json, image/jpeg等
     */
    private String contentType;

    /**
     * 内容编码
     * 如：UTF-8, GBK等
     */
    private String charset;

    /**
     * 内容大小（字节）
     * 原始响应内容的大小
     */
    private Long contentSize;

    /**
     * 爬取深度
     * 从起始URL计算的链接深度，0表示起始页面
     */
    private Integer depth;

    /**
     * 内容摘要
     * 页面内容的简短摘要或描述
     */
    private String summary;

    /**
     * HTML内容
     * 完整的HTML页面内容，存储为TEXT或BLOB类型
     */
    private String htmlContent;

    /**
     * 纯文本内容
     * 从HTML中提取的纯文本内容
     */
    private String textContent;

    /**
     * 处理状态
     * PENDING: 待处理
     * PROCESSING: 处理中
     * PROCESSED: 已处理
     * FAILED: 处理失败
     * IGNORED: 已忽略
     */
    private String processStatus;

    /**
     * 处理信息
     * 处理过程中的附加信息，如错误消息
     */
    private String processMessage;

    /**
     * 处理时间
     * 最后一次处理该结果的时间
     */
    private LocalDateTime processTime;

    /**
     * 处理耗时（毫秒）
     * 处理该结果所花费的时间
     */
    private Long processDuration;

    /**
     * 提取的数据
     * 根据爬虫规则提取的结构化数据，JSON格式存储
     * 使用TypeHandler自动转换为Map
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private Map<String, Object> extractedData;

    /**
     * 元数据
     * 存储关于爬取过程的额外信息，如请求头、响应头等，JSON格式
     * 使用TypeHandler自动转换为Map
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private Map<String, Object> metadata;

    /**
     * 关键词
     * 从内容中提取的关键词，逗号分隔
     */
    private String keywords;

    /**
     * 分类标签
     * 根据内容自动分类的标签，逗号分隔
     */
    private String categories;

    /**
     * 情感分析
     * 内容的情感倾向分析结果
     * POSITIVE: 积极
     * NEUTRAL: 中性
     * NEGATIVE: 消极
     */
    private String sentiment;

    /**
     * 情感分数
     * 情感分析的具体得分，范围-1.0到1.0，值越大越积极
     */
    private Double sentimentScore;

    /**
     * 图片URL列表
     * 从页面提取的所有图片URL，JSON数组格式
     */
    private String imageUrls;

    /**
     * 链接URL列表
     * 从页面提取的所有链接URL，JSON数组格式
     */
    private String linkUrls;

    /**
     * 代理IP ID
     * 用于爬取此内容的代理IP，关联到proxy_ip表
     */
    private Long proxyIpId;

    /**
     * 用户代理
     * 用于爬取此内容的User-Agent
     */
    private String userAgent;

    /**
     * 重试次数
     * 爬取该URL的尝试次数
     */
    private Integer retryCount;

    /**
     * 爬取时间
     * 成功爬取该内容的时间
     */
    private LocalDateTime fetchTime;

    /**
     * 爬取耗时（毫秒）
     * 爬取该内容所花费的时间
     */
    private Long fetchDuration;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 是否已缓存
     * 是否已将内容保存到缓存系统
     */
    private Boolean cached;

    /**
     * 缓存键
     * 缓存系统中的唯一键
     */
    private String cacheKey;

    /**
     * 数据哈希
     * 内容的MD5哈希值，用于检测重复内容
     */
    private String contentHash;

    /**
     * 是否为关键页面
     * 标记特别重要的页面
     */
    private Boolean isKeyPage;
    
    /**
     * 优先级
     * 处理的优先级，数字越大优先级越高
     */
    private Integer priority;
} 
